package com.etc.controller;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;

/**
 * 专门用于下载文件的控制器
 * 从指定服务器中读取文件并输出网页
 * 
 */
@WebServlet("/FileDownloadServlet")
public class FileDownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
      
	/**
	 * @throws IOException 
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException  {
		
		// 读取指定服务器中的文件
		// 存储文件的的目录
		String root = "";
		
		// 通过请求参数type判断下载的是图片资源还是文本文件资源
		String type = request.getParameter("type");
		
		if ("image".equals(type)) {
			// 存储图片的文件目录
			root = "D:\\file\\img\\";
			// root = "/Users/mac/img/";
			
		}else if ("mp3".equals(type)) {
			
			root = "D:\\file\\mp3\\";
		}else if ("lrc".equals(type)) {
			
			root = "D:\\file\\lrc\\";
		}else if("video".equals(type)) {
			root = "D:\\file\\video\\";
		}
		
		// 获取请求参数中的文件名
		String fileName = request.getParameter("fileName");
		
		// 文件的绝对路径
		StringBuffer pathname = new StringBuffer();
		pathname.append(root).append(fileName);
		
		// 关联文件
		File file = new File(pathname.toString());
		
		// 定义字节输入流读取文件内容
		FileInputStream fis = new FileInputStream(file);
		
		// 定义字节数组输出流
		ByteOutputStream bos = new ByteOutputStream();
		
		byte[] b = new byte[1024];
		int n;
		// 边读边写:将字节输入流的内容写入字节数组输出流中
		while ( (n = fis.read(b)) != -1) { // 有数据可读
			// 写
			bos.write(b, 0, n);
		}

		// 设置响应头,告诉浏览器响应的是流媒体,浏览器将文件下载至本地
		response.setHeader("Content-Disposition", "attachment;filename="+fileName);

		// 通过Servlet输出流将文件以字节形式输出到网页中
		ServletOutputStream sos = response.getOutputStream();
		sos.write(bos.getBytes());
		
		// 关闭流
		bos.close();
		fis.close();
	}

}













